package com.simpou.commons.persistence.dao.impl;

import com.simpou.commons.model.entity.BaseEntity;
import com.simpou.commons.utils.lang.annot.RandomFillableConfig;
import com.simpou.commons.utils.behavior.Randomizable;
import com.simpou.commons.utils.lang.Randoms;
import com.simpou.commons.utils.reflection.Casts;

import java.util.List;


/**
 * Implementação básica de um DAO que "persiste" os dados em memória com dados
 * aleatórios. Os dados existem somente em modo execução.
 *
 * @author Jonas Pereira
 * @since 2012-07-10
 * @version 2013-06-01
 */
public class RandomInMemoryDAOImpl extends InMemoryDAOImpl {
    @Override
    protected <T extends BaseEntity> List<T> getRepository(final Class<T> clasz) {
        final boolean containsRepository = containsRepository(clasz);
        final List<T> repository = super.getRepository(clasz);

        if (!containsRepository) {
            final RandomFillableConfig config = clasz.getAnnotation(RandomFillableConfig.class);
            final int amount;

            if (config == null) {
                amount = Randoms.getInteger(RandomFillableConfig.MIN_LENGTH,
                        RandomFillableConfig.MAX_LENGTH);
            } else {
                amount = Randoms.getInteger(config.minLength(),
                        config.maxLength());
            }

            for (int i = 0; i < amount; i++) {
                try {
                    final T t = clasz.newInstance();
                    final Randomizable randomFillable = Casts.simpleCast(t);
                    randomFillable.fillRandom();
                    super.create(t);
                } catch (Exception ex) {
                    throw new RuntimeException(ex);
                }
            }
        }

        return repository;
    }
}
